package com.zmn.oms.third.youshu.dto;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.*;

import java.util.List;

/**
 * 类描述：腾讯有数接单上报数据
 * 官方文档:https://mp.zhls.qq.com/youshu-docs/develop/interface/order/add_order.html
 *
 * @author ligang
 * @since 2022/3/22 10:56
 */
@EqualsAndHashCode(callSuper = true)
@Data
@NoArgsConstructor
@Builder
@AllArgsConstructor
public class YouShuAddOrderDTO extends YouShuRequest {

    /**
     * 数据源Id
     */
    private String dataSourceId;

    /**
     * 订单列表 数组最大长度 50
     */
    private List<YouShuAddOrderDTO.Order> orders;

    /**
     * 订单
     */
    @Data
    @NoArgsConstructor
    @Builder
    @AllArgsConstructor
    public static class Order {

        /**
         * 商家订单号
         */
        @JSONField(name = "external_order_id")
        private String externalOrderId;

        /**
         * 订单创建时间，unix时间戳 字段长度为 13 字节
         */
        @JSONField(name = "create_time")
        private String createTime;

        /**
         * 订单来源,枚举值:商家小程序：wxapp；商家app：app；商家H5：mobileweb；商家pcweb：pcweb；线下人工pos：offstore_pos_manual；线下自助收银：offstore_pos_self_help；其他：other
         */
        @JSONField(name = "order_source")
        private String orderSource;

        /**
         * 订单类型；1：普通订单；2：充值订单；3：消费订单（如停车费）；4:预售订单_预付；5：预售订单_尾款；6：商品券订单（指定商品的券，视同为购买了商品）；7：积分订单；8：代金券订单（所有商品可使用的券） 普通购买商品订单传 1 即可
         */
        @JSONField(name = "order_type")
        private Integer orderType;

        /**
         * 订单商品总数量
         */
        @JSONField(name = "goods_num_total")
        private Integer goodsNumTotal;

        /**
         * 商品总金额，单位默认为元 注：已含单品级别优惠的商品金额，如单品直降
         */
        @JSONField(name = "goods_amount_total")
        private Float goodsAmountTotal;

        /**
         * 订单运费，单位默认为元 注：运费为0时，传0.00
         */
        @JSONField(name = "freight_amount")
        private Float freightAmount;

        /**
         * 订单金额，单位默认为元 注：商品总金额+运费金额=订单金额
         */
        @JSONField(name = "order_amount")
        private Float orderAmount;

        /**
         * 订单应付金额，单位默认为元 注：订单金额-订单级别的优惠金额（如：订单满减）=订单应付金额
         */
        @JSONField(name = "payable_amount")
        private Float payableAmount;

        /**
         * 实付金额，单位默认为元 注：订单应付金额-支付优惠金额（如：微信支付优惠、招商银行优惠等）=订单实付金额
         */
        @JSONField(name = "payment_amount")
        private Float paymentAmount;

        /**
         * 主订单状态，1110待支付，1130未支付取消，1140已支付未发货取消，1150已支付待发货/已支付待核销，1160已发货，1180销售完成/已收货/已核销
         */
        @JSONField(name = "order_status")
        private String orderStatus;

        /**
         * 状态变更时间，unix毫秒级时间，如 order_status状态为 1150 ，则传 1150（已支付待发货）状态变更的时间
         */
        @JSONField(name = "status_change_time")
        private String statusChangeTime;

        /**
         * 用户信息
         */
        @JSONField(name = "user_info")
        private UserInfo userInfo;

        /**
         * 主订单商品信息，数组类型，每个sku存一个数组单位
         */
        @JSONField(name = "goods_info")
        private List<GoodsInfo> goodsInfos;

        /**
         * 主订单每种支付方式的支付信息,order_status = 1110时 payment_info非必填，其他状态码必填
         */
        @JSONField(name = "payment_info")
        private List<PaymentInfo> paymentInfos;

        /**
         * 商家标记订单已删除，0：未删除；1：已删除，为空默认为 0
         */
        @JSONField(name = "is_deleted")
        private Integer isDeleted;
    }

    /**
     * 用户信息
     */
    @Data
    @NoArgsConstructor
    @Builder
    @AllArgsConstructor
    public static class UserInfo {

        /**
         * 下单人 open_id，order_source = wxapp时，必填
         */
        @JSONField(name = "open_id")
        private String openId;

    }

    /**
     * 商品信息
     */
    @Data
    @NoArgsConstructor
    @Builder
    @AllArgsConstructor
    public static class GoodsInfo {
        /**
         * sku 编号
         */
        @JSONField(name = "external_sku_id")
        private String externalSkuId;

        /**
         * sku 名称
         */
        @JSONField(name = "sku_name_chinese")
        private String skuNameChinese;

        /**
         * 单件商品原价，单位默认为元
         */
        @JSONField(name = "goods_amount")
        private Float goodsAmount;

        /**
         * 多件商品实付金额（分摊了优惠的金额）,单位默认为元，注：有数GMV计算使用该字段
         */
        @JSONField(name = "payment_amount")
        private Float paymentAmount;

        /**
         * sku 所属 spu 编号，若无 spu，传输内容请与 external_sku_id 保持一致
         */
        @JSONField(name = "external_spu_id")
        private String externalSpuId;

        /**
         * spu 名称，若无 spu，传输内容请与 sku_name_chinese 保持一致
         */
        @JSONField(name = "spu_name_chinese")
        private String spuNameChinese;

        /**
         * 商品数量
         */
        @JSONField(name = "goods_num")
        private Integer goodsNum;
    }

    /**
     * 支付信息
     */
    @Data
    @NoArgsConstructor
    @Builder
    @AllArgsConstructor
    public static class PaymentInfo {
        /**
         * 支付方式
         */
        @JSONField(name = "payment_type")
        private String paymentType;

        /**
         * 金额
         */
        @JSONField(name = "trans_amount")
        private Float transAmount;

        /**
         * 微信支付订单ID/流水号
         */
        @JSONField(name = "trans_id")
        private String transId;

        /**
         * 微信支付商户系统内部订单号，当 payment_type = 00009 时必填，只能是数字、大小写字母_-*且在同一个商户号下唯一
         */
        @JSONField(name = "out_trade_number")
        private String outTradeNumber;
    }
}
